#pragma once

#include "ICollideAble.h"

////////////////////////////////////////////////////////////////////////////////////////////////////
/// <Summary>	Sphere  </Summary>
/// 
/// <purpose>	Collidable class that defines a sphere	</purpose>
////////////////////////////////////////////////////////////////////////////////////////////////////

class Sphere : public IBoundingCollideAble
{
public:

	/// <Summary> The center point of this sphere </Summary>
	Vector3 center;

	/// <Summary> The radius of this sphere </Summary>
	float radius;

public:

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Default constructor. </Summary>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	Sphere() { }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Virtual Destructor </Summary>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual ~Sphere() { }

public:

	/// <Summary> The collision type of this object </Summary>
	static const HashString COLLISIONTYPE;

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Gets the collision type </Summary>
	///
	/// <Return>	The collision type </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual const HashString& GetCollisionType() const { return COLLISIONTYPE; }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Builds the bounding volume from a set of points </Summary>
	///
	/// <Param name="verts">   	The verts </Param>
	/// <Param name="numVerts">	Number of verts </Param>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void Build(const Vector3* verts, unsigned int numVerts);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	
	/// 	Builds the bound volume from two other bounding volumes of the same type 
	/// </Summary>
	///
	/// <Param name="bounds1">	The first bounds </Param>
	/// <Param name="bounds2">	The second bounds </Param>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void Build(const IBoundingCollideAble* bounds1, const IBoundingCollideAble* bounds2);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Transforms this object by a matrix </Summary>
	///
	/// <Param name="transform">	The transform matrix	</Param>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void Transform(const Matrix4x4& transform);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Translates this object </Summary>
	///
	/// <Param name="translation">	The translation vector	</Param>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void Translate(const Vector3& translation);

protected:

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Prints this object to the console </Summary>
	///
	/// <Param name="out">	The console window </Param>
	///
	/// <Return>	The console window </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual ConsoleWindow& Print(ConsoleWindow& out) const;
};